package com.kds.smarthome.service;

import com.kds.smarthome.dto.StatisticsItemDTO;
import com.kds.smarthome.mapper.StatisticsItemMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 孔德嵩
 * 创建日期 2025/4/21
 */
@Slf4j
@Service
public class StatisticsItemService {

    @Autowired
    private StatisticsItemMapper statisticsItemMapper;

    /**
     * 查询统计项目并解析表达式中的设备ID
     *
     * @param buildingCode 建筑编码
     * @return 统计项目列表
     */
    public List<StatisticsItemDTO> queryStatisticsItems(String buildingCode) {
        List<StatisticsItemDTO> result = new ArrayList<>();

        try {
            // 查询原始数据
            List<Map<String, Object>> items = statisticsItemMapper.selectStatisticsItemsByBuilding(buildingCode);

            // 转换数据
            for (Map<String, Object> item : items) {
                StatisticsItemDTO dto = new StatisticsItemDTO();
                dto.setName((String) item.get("name"));
                dto.setCode((String) item.get("code"));

                // 解析表达式中的设备ID
                String expression = (String) item.get("expression");
                dto.setFids(extractFidsFromExpression(expression));

                result.add(dto);
            }

            log.info("成功查询统计项目 - buildingCode: {}, 项目数量: {}", buildingCode, result.size());
        } catch (Exception e) {
            log.error("查询统计项目失败 - buildingCode: {}, 错误: {}", buildingCode, e.getMessage(), e);
        }

        return result;
    }

    /**
     * 从表达式中提取设备ID
     * 示例表达式：${310113C002_01_b1LightingSockets}+${310113C002_01_b2LightingSockets}
     *
     * @param expression 表达式
     * @return 设备ID列表
     */
    private List<String> extractFidsFromExpression(String expression) {
        List<String> fids = new ArrayList<>();
        if (expression == null || expression.isEmpty()) {
            return fids;
        }

        try {
            // 匹配${...}中的内容，确保匹配完整的设备ID
            Pattern pattern = Pattern.compile("\\$\\{([^{}]+?)\\}");
            Matcher matcher = pattern.matcher(expression);
            
            while (matcher.find()) {
                String fid = matcher.group(1).trim();
                // 验证FID格式（buildingCode_gatewayCode_functionCode）
                if (fid.matches("\\d+[A-Z]\\d+_\\d+_[a-zA-Z0-9]+")) {
                    fids.add(fid);
                } else {
                    log.warn("发现不符合格式的设备ID: {}", fid);
                }
            }
            
            if (fids.isEmpty() && !expression.isEmpty()) {
                log.warn("表达式中未找到有效的设备ID - expression: {}", expression);
            }
        } catch (Exception e) {
            log.error("解析表达式失败 - expression: {}, 错误: {}", expression, e.getMessage(), e);
        }
        
        return fids;
    }
}
